/**
 * @addtogroup bsc_netserver
 * bsc_netserver
 * @{
 */
/**
 * @file        bsc_netserver.h
 * @brief       XXXX
 * @note        XXXX
 * @author      靳普诏(puzhao.jin@hopechart.com)
 * @date        2024/08/27
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2024/08/27   <td>1.0         <td>靳普诏       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_NETSERVER_H_
#define _BSC_NETSERVER_H_

#include "ofc/ofc_types.h"
#include "netlink/NetLink.h"


#ifdef __cplusplus
extern "C"
{
#endif



typedef struct TBsNetServerTag TBsNetServer;


typedef void (*TBsNetServerOnDisconnectEvent)(TBsNetServer *sender);

/**
 * 建立连接回调函数
 * @param sender: 对象指针
 * @param link_id: 客户端连接ID
 * @return True 同意建立连接, False 拒绝建立连接
 */
typedef Bool (*TBsNetServerOnAcceptEvent)(TBsNetServer *sender, Int32 link_id);

/**
 * 释放连接回调函数
 * @param *sender
 * @param link_id    客户端连接ID
 * @return 
 * @note:xxxxx
 */
typedef void (*TBsNetServerOnFreeCltEvent)(TBsNetServer *sender, Int32 link_id);


/**
 * 子链接接收数据回调函数
 * @param *sender
 * @param link_id
 * @param data
 * @param size
 * @return 
 * @note:xxxxx
 */
typedef void (*TBsNetServerOnCltRecvDataEvent)(TBsNetServer *sender, Int32 link_id, const UInt8* data,  Int32 size);




/**
 * 子链路连接成功回调函数
 * @param *sender
 * @param link_id    客户端连接ID
 * @return 
 * @note:xxxxx
 */
typedef void (*TBsNetSrvLinkOnConnectEvent)(TBsNetServer *sender, Int32 link_id);


/**
 * 子链接断开回调函数
 * @param *sender
 * @param link_id    客户端连接ID
 * @return 
 * @note:xxxxx
 */
typedef void (*TBsNetSrvLinkOnDisconnectEvent)(TBsNetServer *sender, Int32 link_id);

/**
 * 子链接超时回调函数
 * @param *sender
 * @param link_id
 * @return 
 * @note:xxxxx
 */
typedef void (*TBsNetSrvLinkOnTimeoutEvent)(TBsNetServer *sender, Int32 link_id);

// 服务器事件定义, 不可以为NULL
typedef struct TBsNetServerEventsTag TBsNetServerEvents;
struct TBsNetServerEventsTag
{
    TBsNetServerOnDisconnectEvent OnDisconnect;         // 服务端的断开侦听
    TBsNetServerOnAcceptEvent OnAccept;                 // 服务端的接受链路, 可以设置链路属性
    TBsNetServerOnFreeCltEvent OnFreeClt;               // 服务端的释放链路
    TBsNetServerOnCltRecvDataEvent OnCltRecvData;       // 链路的接收数据
};

// 客户连接事件定义, 可以为NULL
typedef struct TBsNetSrvLinkEventsTag TBsNetSrvLinkEvents;
struct TBsNetSrvLinkEventsTag
{
    TBsNetSrvLinkOnConnectEvent OnCltConnect;           // 链路的连接成功事件
    TBsNetSrvLinkOnDisconnectEvent OnCltDisconnect;     // 链路的断开事件
    TBsNetSrvLinkOnTimeoutEvent OnCltTimeout;           // 链路的超时事件
};


typedef struct TBsNetSvrCfgTag TBsNetSvrCfg;
struct TBsNetSvrCfgTag
{
    Int32 linger;   // 链路句柄关闭后的拖延时长(秒)
    Int32 timeout;   // 服务端的打开超时(单位: 毫秒)        
    char bind_addr[32];  // 服务端的绑定IP地址. 结尾为'\0'
    Int32 bind_port;  // 服务端的侦听端口号
    Int32 listen_queue;  // 服务端的侦听连接队列尺寸. 建议值:256
    Int32 max_clients;  // 服务端的最大连接数. 0 表示不限制
    Int32 recv_threads; // 服务端的接收线程数. 建议值: 8
    Int32 recv_thread_caches; // 服务端的接收缓存尺寸. 建议值: 8
    Int32 send_queue;  // 服务端的发送缓存尺寸. 0 表示无队列 .建议值: 64
    Int32 keep_timeout;  // 链路的心跳检测超时(单位: 毫秒). -1 表示不检测       // 未实现
    Int32 keep_interval; // 链路的心跳检测重试间隔(单位: 毫秒), 建议值: 10000   // 未实现
    Int32 keep_retry_times; // 链路的心跳检测重试次数, 建议值: 3                // 未实现
};


struct TBsNetServerTag
{
    Int32 srv_id_;          ///< 服务器ID. 记录 NetLink.h 创建返回值. 有效值>=1 
    TBsNetSvrCfg cfg_;
    TBsNetServerEvents server_events_;
    TBsNetSrvLinkEvents link_events_;
};




/**
 * 创建netlink服务端
 * @param *self             对象指针
 * @param *server_events    服务端事件回调
 * @param *link_events      连接事件回调
 * @return > 0 创建成功
 *         <= 0 错误码
 * @note:xxxxx
 */
Int32 TBsNetServerCreate(TBsNetServer *self, TBsNetServerEvents *server_events, TBsNetSrvLinkEvents *link_events);

/**
 * 销毁netlink服务端
 * @param self: 对象指针
 * @return 
 */
void TBsNetServerDestroy(TBsNetServer *self);


/**
 * 初始化netlink服务端
 * @param *self   对象指针
 * @param *cfg    配置参数. 
 * @return 
 * @note: cfg 需要为全局变量
 */
Int32 TBsNetServerInit(TBsNetServer *self, TBsNetSvrCfg *cfg);

/**
 * 反初始化netlink服务端
 * @param *self   对象指针
 * @return 
 * @note:xxxxx
 */
void TBsNetServerDone(TBsNetServer *self);


/**
 * 打开netlink服务端
 * @param self: 对象指针
 * @param ip: 服务端绑定ip地址
 * @param port: 服务端绑定端口
 * @param max_clients: 客户端数
 * @return 见 Net_TResult
 */
Int32 TBsNetServerOpen(TBsNetServer *self);

/**
 * 关闭netlink服务端
 * @param self: 对象指针
 */
void TBsNetServerClose(TBsNetServer *self);



/**
 * 获取当前状态
 * @param *self      对象指针
 * @param *errcode   错误码. NULL 不返回错误码
 * @return >= 对象状态 @ref Net_TObjState
 *         < 0 错误码
 * @note:enum Net_TObjState
        {Net_osInactive       = 0,        // 未打开
         Net_osClosing        = 1,        // 正在关闭
         Net_osOpening        = 2,        // 正在打开
         Net_osOpened         = 3};       // 已打开
 */
Int32 TBsNetServerState(TBsNetServer *self, Int32 *errcode);

/**
 * 获取服务端id
 * @param *self      对象指针
 * @param *errcode   错误码. NULL 不返回错误码
 * @return >=0 服务端id, netlink.so 模块返回的id
 * @note:xxxxx
 */
Int32 TBsNetServerSrvID(TBsNetServer *self, Int32 *errcode);


/**
 * 获取错误信息
 * @param *self      对象指针
 * @param *errcode
 * @return 
 * @note:xxxxx
 */
const char *TBsNetServerError(TBsNetServer *self, Int32 *errcode);


/**
 * 获取当前连接数
 * @param *self
 * @param *errcode
 * @return 
 * @note:xxxxx
 */
Int32 TBsNetServerLinkCount(TBsNetServer *self, Int32 *errcode);


/*-------------------------------------------------------------*/

/**
 * 获取所属服务端id
 * @param link_id   客户端连接id
 * @return > 0 服务端id
 *         <= 0 错误码
 * @note:xxxxx
 */
Int32 BsNetSrvLinkServerId(Int32 link_id);


/**
 * 当前客户端连接状态
 * @param link_id
 * @return >= 对象状态 @ref Net_TObjState
 *         < 0 错误码
 * @note:enum Net_TObjState
        {Net_osInactive       = 0,        // 未打开
         Net_osClosing        = 1,        // 正在关闭
         Net_osOpening        = 2,        // 正在打开
         Net_osOpened         = 3};       // 已打开
 */
Int32 BsNetSrvLinkState(Int32 link_id);


/**
 * 获取客户端地址信息
 * @param link_id
 * @param peer_addr  链路的对端地址
 * @param peer_port  链路的对端端口号
 * @param curr_addr  链路的本地地址
 * @param curr_port  链路的本地端口号
 * @return > 0 获取成功
 *         <= 0 错误码
 * @note:返回参数为 NULL时, 表示不关注.
 */
Int32 BsNetSrvLinkAddrInfo(Int32 link_id, const char **peer_addr, Int32 *peer_port, const char **curr_addr, Int32 *curr_port);


/**
 * 获取客户端数据收发信息
 * @param link_id
 * @param *recv_bytes  链路的接收总字节数(只读)
 * @param *recv_msecs  链路的最后一次接收数据到现在的毫秒数
 * @param *send_bytes  链路的发送总字节数(只读)
 * @param *send_msecs  链路的最后一次发送数据到现在的毫秒数
 * @return > 0 获取成功
 *         <= 0 错误码
 * @note:返回参数为 NULL时, 表示不关注.
 */
Int32 BsNetSrvLinkRSDataInfo(Int32 link_id, Int32 *recv_bytes, Int32 *recv_msecs, Int32 *send_bytes, Int32 *send_msecs);


/**
 * 获取错误信息
 * @param link_id
 * @return 
 * @note:xxxxx
 */
const char *BsNetSrvLinkError(Int32 link_id);

/**
 * 客户数据发送接口
 * @param link_id    客户端连接id
 * @param *data
 * @param data_len
 * @return >=0 发送成功的字节数
 *         < 0  发送失败
 * @note:xxxxx
 */
Int32 BsNetSrvLinkSendData(Int32 link_id, UInt8 *data, Int32 data_len);


/**
 * 服务器主动断开客户端连接
 * @param link_id
 * @return > 0 执行成功
 *         <= 0 执行失败
 * @note:xxxxx
 */
Int32 BsNetSrvLinkDisconnect(Int32 link_id);


#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _BSC_NETSERVER_H_

/**
 * @}  Generated on "2024-08-27 10:53:19" by the tool "gen_hq_file.py >> V20231119" 
 */

